package com.roamer.school.shiro.util;

import com.roamer.school.repository.entity.sys.SysUser;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;

import java.util.Optional;

/**
 * Shiro 工具类
 *
 * @author roamer
 * @version V1.0
 * @date 2018/12/29 14:58
 */
public abstract class ShiroUtils {

    /**
     * 获取当前Subject
     *
     * @return {@code Subject} current Subject
     */
    public static Subject getSubject() {
        return org.apache.shiro.SecurityUtils.getSubject();
    }

    /**
     * 获取当前用户
     *
     * @return {@code Optional<SysUser>} 当前用户
     *
     * @see org.apache.shiro.subject.Subject#getPrincipal()
     */
    public static Optional<SysUser> getCurrentUser() {
        return Optional.ofNullable((SysUser) org.apache.shiro.SecurityUtils.getSubject().getPrincipal());
    }

    /**
     * 获取当前用户ID
     *
     * @return {@code Optional<Long>} 当前用户ID
     */
    public static Optional<Long> getUserId() {
        Optional<SysUser> user = getCurrentUser();
        return user.map(SysUser::getId);
    }


    /**
     * 获取Session
     *
     * @return 当前 {@code Subject} 关联的 {@code Session},如不存在时，则创建一个
     */
    public static Session getSession() {
        return org.apache.shiro.SecurityUtils.getSubject().getSession();
    }

    /**
     * 设置Session属性
     *
     * @param key   属性名
     * @param value 属性值
     */
    public static void setSessionAttribute(Object key, Object value) {
        getSession().setAttribute(key, value);
    }

    /**
     * 获取Session属性
     *
     * @param key 属性名
     *
     * @return @{@code Object} 属性值
     */
    public static Object getSessionAttribute(Object key) {
        return getSession().getAttribute(key);
    }

    /**
     * 是否登陆
     *
     * @return {@code true} 已登陆
     */
    public static boolean isLogin() {
        return org.apache.shiro.SecurityUtils.getSubject().getPrincipal() != null;
    }

    /**
     * 登出
     */
    public static void logout() {
        org.apache.shiro.SecurityUtils.getSubject().logout();
    }

}
